import org.junit.Test;

/**
 * 反射
 * <p>
 * 反射的出现背景
 * Java程序中，所有的对象都有两种类型：编译时类型和运行时类型，
 * 很多时候，对象的编译时类型和运行时类型不一致。
 * Object object = new String("111");
 * System.out.println(object.getClass());
 * <p>
 * eg:某些变量或形参的声明类型是Object类型，但是程序却需要调用该对象运行时类型的方法，
 * ---该方法不是Object中的方法，如何解决？
 * ① 在编译和运行时都完全知道类型的具体信息，在这种情况下，可以直接先使用instanceof运算符进行判断，
 * ---再利用强制类型转换符将其转化为运行时类型的变量即可。
 * ② 编译时根本无法预知该对象的真实信息，程序只能依靠运行时信息来发现该对象和类的真实信息，
 * ---这就必须使用反射。
 * <p>
 * 概述
 * -反射(Reflection)是被视为动态语言的关键，反射机制允许程序在运行期间借助于Reflection API取得任何类的内部信息，
 * -----并能直接操作任意对象的内部属性和方法。
 * <p>
 * Java反射机制提供的功能：
 * -在运行时判断任意一个对象所属的类
 * -在运行时构造任意一个类的对象
 * -在运行时判断任意一个类所具有的成员变量和方法
 * -在运行时获取泛型信息
 * -在运行时调用任意一个对象的成员变量和方法
 * -在运行时处理注解
 * -生成动态代理
 * <p>
 * 反射优点：
 * -提高了Java程序的灵活性和扩展性，降低了耦合度，提高自适应能力
 * -允许程序创建和控制任何类的对象，无需提前硬编码目标类
 * 缺点：
 * -反射的性能较低。-反射机制主要应用在对灵活性和扩展性要求高的系统框架上。
 * -反射会模糊程序内部逻辑，可读性较差。
 * <p>
 */
public class ReflectionTest {
    @Test
    public void test1() {
        Object object = new String("111");
        System.out.println(object.getClass()); // class java.lang.String
        /*
            public boolean equals(Object obj) {
                return (this == obj);
            }
         */
        System.out.println(object.equals("111")); // true
    }
}
